package br.com.jvet.entidade;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

@Entity
@Table(name = "tbmarcacaoexame")
@SequenceGenerator(name = "seq_marcacaoexame", sequenceName = "seq_marcacaoexame", initialValue = 1, allocationSize = 1)
public class MarcacaoExame implements Serializable {

	private static final long serialVersionUID = -1823222395183807482L;
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_marcacaoexame")
	private int codigo;
	@OneToOne(cascade = CascadeType.ALL)
	private Agendamento agendamento;
	@OneToOne
	private Exame exame;
	@OneToOne(optional = true, cascade = CascadeType.ALL, orphanRemoval = true)
	@JoinColumn(name = "codpagamento", referencedColumnName = "codigo", nullable = true)
	private Pagamento pagamento;
	@Transient
	private double valorTotal;
	@Column
	private boolean possuiPagamento = false;
	@Column
	@Temporal(TemporalType.TIMESTAMP)
	private Date dataFechamento;

	public MarcacaoExame() {
		super();
		exame = new Exame();
		pagamento = new Pagamento();
	}

	public int getCodigo() {
		return codigo;
	}

	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}

	public Agendamento getAgendamento() {
		return agendamento;
	}

	public void setAgendamento(Agendamento agendamento) {
		this.agendamento = agendamento;
	}

	public Exame getExame() {
		return exame;
	}

	public void setExame(Exame exame) {
		this.exame = exame;
	}

	public Pagamento getPagamento() {
		return pagamento;
	}

	public void setPagamento(Pagamento pagamento) {
		this.pagamento = pagamento;
	}

	public double getValorTotal() {
		if (getExame() != null && getExame().getCodigo() > 0) {
			valorTotal = getExame().getPrecoCobrado();
		}
		return valorTotal;
	}

	public void setValorTotal(double valorTotal) {
		this.valorTotal = valorTotal;
	}

	public boolean isPossuiPagamento() {
		return possuiPagamento;
	}

	public void setPossuiPagamento(boolean possuiPagamento) {
		this.possuiPagamento = possuiPagamento;
	}

	public Date getDataFechamento() {
		return dataFechamento;
	}

	public void setDataFechamento(Date dataFechamento) {
		this.dataFechamento = dataFechamento;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + codigo;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		MarcacaoExame other = (MarcacaoExame) obj;
		if (codigo != other.codigo)
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "MarcacaoExame [codigo=" + codigo + ", exame=" + exame
				+ ", valorTotal=" + valorTotal + ", possuiPagamento="
				+ possuiPagamento + ", dataFechamento=" + dataFechamento + "]";
	}

	public MarcacaoExame clone() {
		MarcacaoExame marc = new MarcacaoExame();
		marc.setAgendamento(agendamento);
		marc.setCodigo(codigo);
		marc.setExame(exame);
		marc.setPagamento(pagamento);
		marc.setPossuiPagamento(possuiPagamento);
		marc.setValorTotal(valorTotal);
		marc.setDataFechamento(dataFechamento);

		return marc;
	}

}
